﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AGPR.Locadora.Data;
using AGPR.Locadora.Utils;

namespace AGPR.Locadora.Model
{
    /// <summary>
    /// Classe de Gênero
    /// </summary>
    public class Genero
    {
        private static ActiveRecord db = ActiveRecord.Instancia;

        #region Atributos

        /// <summary>
        /// Tabela de Gêneros no Banco de Dados
        /// </summary>
        const string TABELA = "genero";

        /// <summary>
        /// Código do Gênero
        /// </summary>
        public int id { get; set; }

        /// <summary>
        /// Nome do Gênero
        /// </summary>
        public string nome { get; set; }

        #endregion

        #region Create

        /// <summary>
        /// Retorna uma Instância Genero
        /// </summary>
        /// <param name="dados">Dados a serem populados</param>
        /// <returns>Genero</returns>
        public static Genero Create(dynamic dados = null)
        {
            Genero genero = new Genero();

            if (dados != null)
            {
                genero.id = Convert.ToInt32(dados["id_genero"]);
                genero.nome = dados["nome_genero"];
            }

            return genero;
        }

        #endregion

        #region getNextID

        /// <summary>
        /// Retorna o Proximo ID
        /// </summary>
        /// <returns>ID</returns>
        private int getNextID()
        {
            return db.max("id_genero", TABELA) + 1;
        }

        #endregion

        #region Cadastrar

        /// <summary>
        /// Cadastra o Gênero no Banco de Dados
        /// </summary>
        /// <returns>Genero</returns>
        public Genero Cadastrar()
        {
            this.id = this.id > 0 ? this.id : this.getNextID();

            db.insert(TABELA, new Dictionary<string, dynamic>
            {
                {"id_genero", this.id},
                {"nome_genero", this.nome}
            });

            return this;
        }

        #endregion

        #region Alterar

        /// <summary>
        /// Altera o Gênero no Banco de Dados
        /// </summary>
        /// <returns>Genero</returns>
        public Genero Alterar()
        {
            if (this.id > 0)
            {
                db.where("id_genero", this.id);
                db.update(TABELA, new Dictionary<string, dynamic>
                {
                    {"nome_genero", this.nome}
                });
            }

            return this;
        }

        #endregion

        #region Excluir

        /// <summary>
        /// Exclui um Gênero da base de dados
        /// </summary>
        /// <returns>Genero</returns>
        public Genero Excluir()
        {
            if (this.id > 0)
            {
                // Só excluo se não tiver nenhum produto
                if (this.TotalProdutos() == 0)
                {
                    db.where("id_genero", this.id).delete(TABELA);
                }
            }

            return this;
        }

        #endregion

        #region TotalProdutos

        /// <summary>
        /// Retorna o Total de Produtos desta Gênero
        /// </summary>
        /// <returns>Total</returns>
        public int TotalProdutos()
        {
            db.where("id_genero", this.id);
            return db.count(Produto.TABELA);
        }

        #endregion

        #region Get

        /// <summary>
        /// Retorna um Gênero
        /// </summary>
        /// <param name="id">Código do Gênero</param>
        /// <returns>Genero</returns>
        public static Genero Get(dynamic id)
        {
            var item = db.where("id_genero", id).selectOne(TABELA);

            return item != null ? Genero.Create(item) : null;
        }

        #endregion

        #region GetAll

        /// <summary>
        /// Retorna todos as Generos em forma de lista
        /// </summary>
        /// <returns>Generos</returns>
        public static List<Genero> GetAll(int? offset = null)
        {
            List<Genero> generos = new List<Genero>();

            if (offset != null)
            {
                db.limit(Convert.ToInt32(offset), Config.PageLimit);
            }

            foreach (var genero in db.order_by("nome_genero").select(TABELA))
            {
                generos.Add(Genero.Create(genero));
            }

            return generos;
        }

        #endregion

        #region Total

        /// <summary>
        /// Retorna o Total de Gêneros Cadastradas
        /// </summary>
        /// <returns>Total</returns>
        public static int Total()
        {
            return db.count(TABELA);
        }

        #endregion

        #region Html

        /// <summary>
        /// Retorna lista de Generos em html
        /// </summary>
        /// <param name="generoAtual">Genero padrão</param>
        /// <returns>Html de Generos</returns>
        public static string Html(int generoAtual = 0)
        {
            string html = "", selected;

            foreach (Genero g in GetAll())
            {
                selected = g.id == generoAtual ? " selected=\"selected\"" : "";
                html += "<option value=\"" + g.id + "\" " + selected + ">" + g.nome + "</option> \n";
            }

            return html;
        }

        #endregion
    }
}
